from django.shortcuts import render,redirect
from django.views import View
import jsonpickle
from cart.cartmanager import getCartManger
from utils.alipay import AliPay
from django.db.transaction import atomic     #事务   原子操作 ：所有操作要不是全部成功，就全部失败
import json,uuid,datetime
from User.models import *
from goods.models import *
from .models import *
from cart.models import *
from django.db.models import F
from django.http import HttpResponse
#创建支付宝的支付对象
alipay = AliPay(appid='2016091600523086',
                return_url='http://127.0.0.1:9000/order/checkorder',
                app_notify_url='http://127.0.0.1:9000/order/checkorder',
                app_private_key_path='my_private.txt',
                alipay_public_key_path='alipay_public.txt',
                debug=True)

# Create your views here.
class OrderView(View):
    def get(self,request):
        #判断用户是否登录
        if not request.session.get('user'):    #没有登录
            #跳转到登录页面，将一些参数传给登录页面，登录后还要跳转回来
            return redirect('/user/login?redirect=order&cartitems='+request.GET.get('cartitems'))
        else:  #已经登录
            #将收到的选中的商品列表字符串转换成列表对象
            raw_cartitems = jsonpickle.loads('['+request.GET.get('cartitems')+']')
            #将转换后的商品列表存储到session
            request.session['raw_cartitems'] = raw_cartitems
            #跳转到订单显示页面
            return redirect('/order/order.html')

class OrderListView(View):
    def get(self,request):
        #获取订单中的商品
        cartitems = request.session.get('raw_cartitems')
        print(cartitems)
        #获取购物车管理类
        cartManager = getCartManger(request)
        #遍历商品列表转换成购物车模型对象
        cart_items = [cartManager.get_cartitems(**item) for item in cartitems]
        print(cart_items)

        #获取当前用户的默认收货地址
        address = request.session.get('user').address_set.get(isdefault=True)

        #计算商品总价格
        totalPrice = 0
        for cartItem in cart_items:
            totalPrice += cartItem.totalPrice()

        return render(request,'order.html',{'cartitems':cart_items,'address':address,'totalprice':totalPrice})


class ToOrderView(View):
    '''
    将购物项转换成订单项(待支付)
    将购物项从购物车删除
    修改库存
    根据支付方式跳转到支付界面
    支付成功
    验签
    修改订单状态--->待发货
    '''
    @atomic
    def get(self,request):
        #从参数中获取购物项，进行数据转化
        cartitems = request.GET.get('cartitems')
        cartitems = json.loads(cartitems)
        print(cartitems)
        #将购物项转换成订单项(待支付)
        raw_order = {
            'address':Address.objects.get(id=request.GET.get('address')),
            'payway':request.GET.get('payway','alipay'),
            'out_trade_num':uuid.uuid4().hex,
            'order_num':datetime.datetime.today().strftime('%Y%m%d%H%M%S'),
            'user':request.session.get('user')
        }
        #创建订单模型
        order = Order.objects.create(**raw_order)

        total_amount = 0
        for item in cartitems:
            # 创建明细模型
            orderItem = OrderItem.objects.create(order=order,**item)
            #计算订单总金额
            total_amount += orderItem.total_price()
            #删除购物车
            CartItem.objects.filter(user=request.session.get('user'),**item).delete()
            #修改商品库存
            Inventory.objects.filter(goods_id=item['goodsid'],size_id=item['sizeid'],color_id=item['colorid'])\
                .update(count=F('count')-int(item['count']))
        #删除session中的购物项
        if 'raw_cartitems' in request.session:
            del request.session['raw_cartitems']

        #进行支付
        params = alipay.direct_pay(subject='九块九电商',total_amount=total_amount,out_trade_no=order.out_trade_num)
        url = 'https://openapi.alipaydev.com/gateway.do?'+params
        return redirect(url)


class CheckOrderView(View):
    def get(self,request):
        #获取支付宝传过来的数据，转换成字典
        d = request.GET.dict()
        #从字典中获取支付宝的签名
        sign = d.pop('sign')
        #通过签名验证支付宝数据的有效性
        if alipay.verify(d,sign):     #验证成功
            #获取订单编号
            out_trade_no = d.get('out_trade_no')
            #从数据库中查询对应的订单
            order = Order.objects.get(out_trade_num=out_trade_no)
            #修改订单的状态
            if order.status == '待付款':
                order.status = '待发货'
                #记录支付宝的交易凭证
                order.trade_no = d.get('trade_no')
                order.save()
            return HttpResponse('交易成功')
        else:
            return HttpResponse('交易失败')

#todo:1、后台管理 2、地址删除、设默认地址 3、显示用户订单历史记录 4、集成其它支付方式
